#include <iostream>
using std::cout;
using std::endl;

class A{
public:
    virtual void a(){ cout << "A::a()" << endl; } 
    void b(){ cout << "A::b()" << endl; } 
    virtual void c(){ cout << "A::c()" << endl; } 
    void e(){ cout << "A::e()" << endl; }
};

class B{
public:
    virtual void a(){ cout << "B::a()" << endl; } 
    void c(){ cout << "B::c()" << endl; } 
    void d(){ cout << "B::d()" << endl; } 
    virtual void f(){ cout << "B::f()" << endl; }
};

class C
: public A
, public B
{
public:
    virtual void a(){ cout << "C::a()" << endl; } 
    virtual void b(){ cout << "C::b()" << endl; } 
    void c(){ cout << "C::c()" << endl; } 
    void d(){ cout << "C::d()" << endl; } 
};

void test0(){
    C c;
    c.a(); //C::a() 隐藏
    c.b(); //C::b() 隐藏
    c.c(); //C::c() 隐藏 是虚函数 不通过虚函数表
    c.d(); //C::d() 隐藏 不是虚函数
    c.e(); //A::e() 通过A类基类子对象调用
    c.f(); //B::f() 通过B类基类子对象调用 不通过虚表
    
	cout << endl;
	A* pa = &c;
	pa->a(); //C::a() 动态多态
	pa->b(); //A::b() 对于A类b函数不是虚函数
	pa->c(); //C::c() 动态多态
	/* pa->d(); //A类没有定义d函数 */
	pa->e(); //A::e() 不是虚函数
	/* pa->f();//A类没有定义f函数 */

	cout << endl;
	B* pb = &c;
	pb->a(); //C::a() 动态多态
	/* pb->b(); //B没有定义b函数 */
	pb->c(); //B::c() 对于B类c函数不是虚函数
	pb->d(); //B::d() 同上
	/* pb->e();//B没有定义e函数 */
	pb->f(); //B::f() 通过虚函数表

	cout << endl;
	C * pc = &c;
	pc->a(); //C::a() 通过虚函数表
	pc->b(); //C::b() 同上
    pc->c(); //C::c() 同上
	pc->d(); //C::d() 隐藏 不是虚函数
	pc->e(); //A::e() 继承自A类的普通函数e
	pc->f(); //B::f() 即使C类覆盖了f函数也不属于动态多态
}

int main(void){
    test0();
    return 0;
}
